package setting

import (
	"flag"
	"github.com/spf13/viper"
	"go-admin/pkg/util"
	"log"
	"os"
	"path/filepath"
)

var (
	configName    = flag.String("config", "config", "配置文件名称，默认 config")
	configType    = flag.String("yaml", "yaml", "配置文件类型，默认 yaml")
	configDirName = flag.String("configs", "configs", "配置文件夹名称，默认 configs")
)

type Setting struct {
	vp   *viper.Viper
}

// 实例化viper对象
func NewViper() (*Setting, error) {
	vp := viper.New()
	vp.SetConfigName(*configName) // 文件名称
	vp.AddConfigPath("configs/")  // 文件路径
	vp.AddConfigPath(InferRootDir() + "/" + *configDirName)
	vp.SetConfigType(*configType) // 文件后缀
	if err := vp.ReadInConfig(); err != nil {
		return nil, err
	}
	return &Setting{vp: vp}, nil
}



// 推到项目的根目录
func InferRootDir() string {
	// 返回一个对应当前工作目录的根路径，会返回一个
	cwd, err := os.Getwd()
	if err != nil {
		log.Fatalf("获取根路径错误：%v", err)
	}
	var infer func(d string) string
	infer = func(d string) string {
		if d == "/" {
			log.Fatalf("请确保项目根目录或子目录下运行程序，当前在：%v", cwd)
		}
		// 判断是否存在当前配置文件目录
		if util.Exist(d + "/" + *configDirName) {
			return d
		}
		return infer(filepath.Dir(d))
	}
	return infer(cwd)
}
